package hehe.json;
import hehe.json.json.Jsoniter;
import hehe.json.util.JsonUtil;
import hehe.log.collect.SyncCollect;

import java.util.HashMap;
import java.util.Map;

/**
 * json 接口
 * <B>说明：</B>
 * <pre>
 *  略
 * </pre>
 * <B>示例：</B>
 * <pre>
 *  略
 * </pre>
 * <B>日志：</B>
 * <pre>
 *  略
 * </pre>
 * <B>注意事项：</B>
 * <pre>
 *  略
 * </pre>
 */
public class Json
{
    public static final String JACKSON_JSON = "Jackson";

    private static BaseJson defaultJson = new Jsoniter();

    protected static Map<String,BaseJson> jsons = new HashMap<>();

    /**
     * 序列化
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public static String format(Object value) throws Exception
    {
        return defaultJson.format(value);
    }

    /**
     * 反序列化
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public static <T> T parser(String json,Class<T> type) throws Exception
    {
        return (T)defaultJson.parser(json,type);
    }

    /**
     * 获取json 对象
     *<B>说明：</B>
     *<pre>
     * 　支持单例功能
     *</pre>
     */
    public static BaseJson getJson(String jsonType)
    {
        if (jsons.containsKey(jsonType)) {
            return jsons.get(jsonType);
        } else {
            BaseJson json = make(jsonType);
            jsons.put(jsonType,json);
            return json;
        }
    }

    /**
     * 创建json 对象
     *<B>说明：</B>
     *<pre>
     * 　略
     *</pre>
     */
    public static BaseJson make(String jsonType)
    {
        String jsonClazz = getPackageName() + ".json." + jsonType;
        System.out.println(jsonClazz);
        return (BaseJson)JsonUtil.make(jsonClazz);
    }

    public static String packageName;

    /**
     * 获取当前类包名
     *<B>说明：</B>
     *<pre>
     * 　略
     *</pre>
     * @return 当前包名
     */
    public static String getPackageName()
    {
        if (packageName == null) {
            // 获取当前类的包名（不包含自己）
            packageName = new Object()    {
                public String getPackageName()
                {
                    Class onwClass = this.getClass();
                    Package dbPackage =  onwClass.getPackage();
                    return  dbPackage.getName();
                }
            }.getPackageName();
        }

        return packageName;
    }
}
